There are many programming languages available for developing applications. Examples of such programming languages include C, C++, and C#. These programming languages provide a syntax for writing source code in a manner such that a static compiler can compile the source code into an object file. The object file is then linked with one or more other object files using a linker. The resulting file, after linking these object files, is an executable file for an application. Because different types of computers have different processors and each processor has a different instruction set, the source code is re-compiled and re-linked to create an executable file for each type of processor. Thus, multiple executable files are created for use on different processors. A software vendor must then test and maintain each of these executable files.
With the advent of the Internet in which many different types of computers are networked together, generating multiple executable files for different processors has become even more undesirable. Therefore, mark-up languages, such as HTML, have become popular. Mark-up languages allow the creation of one file that can be distributed to computers having different processors without having to generate individual files for the different processors. The mark-up files are interpreted during run-time for execution. In a further development, intermediate languages have been developed that provide the ease of mark-up languages while, in most cases, providing faster program execution speeds than the interpretive process. A “just-in-time” compiler (hereinafter, referred to as a JIT compiler) translates the intermediate language into native code for a specific processor. Each computer having a different type of processor has its own version of a JIT compiler that compiles the intermediate format file to its respective native code, which is CPU-dependent. Thus, these intermediate languages allow software vendors to generate one file (an intermediate format file) and distribute that file to computers having various processors.
Typically, during JIT compiling of the intermediate format file, the native code is not created until the underlying method within the intermediate format file is called. Therefore, the JIT compilation process occurs during program execution. In addition, the JIT compiler typically compiles methods on a method by method basis after the method has been called. If the same method is called again later, the JIT compiler does not process the method again, but rather re-executes the native code that was previously stored. These types of environments which have self-contained operating environments for processing CPU-independent code are commonly referred to as virtual machine environments.
While the concept of using intermediate code and JIT compilers is very desirable, this concept currently is limited to computers with adequate resources, such as memory. This limitation is due to the additional cost (both CPU and memory) associated with performing the JIT compilation process (e.g., syntax analysis) during execution. In systems that are constrained by the amount of available random access memory, the storage of the JIT generated code is not practical. The JIT generated code consumes too much of the available RAM space. While these small computing devices could JIT compile the intermediate code each time without storing the JIT generated code, the execution speed of the applications would not be acceptable. Thus, small consumer devices, such as cell phones, personal digital assistants, and the like, currently have limited opportunity for dynamically generating code. Due to at least these limitations, the current environment for dynamic code generation is not ideal.